/*
 * Merger.cpp
 *
 *  Created on: Mar 30, 2011
 *      Author: s88900
 */

#include "Merger.h"
#include <iostream>

Merger::Merger(int id, IOController *ioc) :
	Thread("Merger") {
	Mid = id;
	this->ioc = ioc;
	for (int i = 0; i < 3; i++) {
		buffer[i] = '0';
	}
	lock[0] = new Mutex();
	lock[1] = new Mutex();
	lock[2] = new Mutex();
}

void Merger::run() {
	for (;;) {
		send();
	}
}

void Merger::send() {
	for (int i = 0; i < 3; i++) {
								// AKK: Niets belet je nu om oude beelden nog eens te versturen.
								// solved

		if(buffer[i] != '0'){
			lock[i]->lock();
			ioc->receive((i * 3) + Mid, buffer[i]);
			buffer[i] = '0'; //beeld is verstuurd, buffer word leeggemaakt
			lock[i]->unlock();
		}
	}
}

// AKK: Camera(s) doen ...
void Merger::newImage(int id, char image) {
	lock[id / 3]->lock();
								// AKK: Nu blokkeer je de twee andere camera's !
								//		Dus gaat nu de framerate met een factor 3 omlaag.
								//fixed door 3 locks te gebruiken
	buffer[id / 3] = image;		// AKK: Deze buffer is gemeenschappelijk voor deze camera
								//		en de merger, dus gaat de framerate nog verder omlaag.
	lock[id / 3]->unlock();
	//cout << "merger saved image" << endl;
}

Merger::~Merger() {
	Mid = 0;
	for (int i = 0; i < 3; i++) {
		buffer[i] = 0;
	}
	delete buffer;
	delete ioc;
}
